//1.避免全局变量
function globals() {
    //只需要在声明myObject时加上var就行了
    let myObject = {//如果函数中的变量不使用 var 定义，则默认为 全局变量

      name : 'Jory'
    };

    return myObject;
}
console.log(globals());

//2.正确的定义函数

function functions(flag) {
    function getValue() { 
        if (flag) return 'a';
        else return 'b';
    }
    return getValue();
}
console.log(functions());

//3.判断两个数是否相等
function identity(val1,val2){
    if(val1===val2){
        return true;
    }else{
        return false;
    }
}
console.log(identity());

//
function identity1(arr1,arr2){
    if(arr1===arr2)return true;
    else return false;
}
console.log(identity());

//4.计时器
function count(start,end){
    console.log(start++);
    var timer = setInterval(function(){
        if(start<=end){
            console.log(start++);
        }else{
            clearInterval(timer);
        }
    },100);
    return {
        cancel:function(){
            clearInterval(timer);
        }
    }
}
// //console.log(count());
// var c1 = count();
// console.log(c1.inc());
// console.log(c1.inc());
// console.log(c1.inc());

function create_counter(initial) {
    var x = initial || 0;
    return {
        inc: function () {
            x += 1;
            return x;
        }
     }
}
var c1 = create_counter();
console.log(c1.inc());
console.log(c1.inc());
console.log(c1.inc());

var c2 = create_counter(10);
console.log(c2.inc());
console.log(c2.inc());
console.log(c2.inc());
/*在返回的对象中，实现了一个闭包，该闭包携带了局部变量x，
并且，从外部代码根本无法访问到变量x。
换句话说，闭包就是携带状态的函数，并且它的状态可以完全对外隐藏起来*/

//5.流程控制

//6.函数传参

//7.函数的上下文

//8.返回函数

//9.使用闭包

//10.二次封装函数

//11、使用arguments

//12.使用apply调用函数

//13、柯理化
   